home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / edit / elv18src.zip / vi.c < prev    next >
C/C++ Source or Header  |  1994-01-13  |  22KB  |  876 lines

  1. /* vi.c */
  2.  
  3. /* Author:
  4.  *    Steve Kirkendall
  5.  *    Beaverton, OR 97005
  6.  *    kirkenda@cs.pdx.edu
  7.  */
  8.  
  9.  
  10. #include "config.h"
  11. #include "ctype.h"
  12. #include "vi.h"
  13.  
  14.  
  15.  
  16. /* This array describes what each key does */
  17. #define NO_FUNC        (MARK (*)())0
  18.  
  19. #define NO_ARGS        0
  20. #define CURSOR        1
  21. #define CURSOR_CNT_KEY    2
  22. #define CURSOR_MOVED    3
  23. #define CURSOR_EOL    4
  24. #define ZERO        5
  25. #define DIGIT        6
  26. #define CURSOR_TEXT    7
  27. #define KEYWORD        8
  28. #define CURSOR_KEY    9
  29. #define ARGSMASK    0x0f
  30. #define    C_C_K_REP1    (CURSOR_CNT_KEY | 0x10)
  31. #define C_C_K_CUT    (CURSOR_CNT_KEY | 0x20)
  32. #define C_K_CUT        (CURSOR_KEY | 0x20)
  33. #define C_C_K_MARK    (CURSOR_CNT_KEY | 0x30)
  34. #define C_C_K_CHAR    (CURSOR_CNT_KEY | 0x40)
  35. #ifndef NO_SHOWMODE
  36. static int keymodes[] = {0, WHEN_REP1, WHEN_CUT, WHEN_MARK, WHEN_CHAR};
  37. # define KEYMODE(args) (keymodes[(args) >> 4])
  38. #else
  39. # define KEYMODE(args) 0
  40. #endif
  41.  
  42. static struct keystru
  43. {
  44.     MARK    (*func)();    /* the function to run */
  45.     uchar    args;        /* description of the args needed */
  46. #ifndef NO_VISIBLE
  47.     short    flags;
  48. #else
  49.     uchar    flags;        /* other stuff */
  50. #endif
  51. }
  52.     vikeys[] =
  53. {
  54. /* NUL not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  55. #ifndef NO_EXTENSIONS
  56. /* ^A  find cursor word */    {m_wsrch,    KEYWORD,    MVMT|NREL|VIZ},
  57. #else
  58. /* ^A  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  59. #endif
  60. /* ^B  page backward    */    {m_scroll,    CURSOR,        FRNT|VIZ},
  61. /* ^C  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  62. /* ^D  scroll dn 1/2page*/    {m_scroll,    CURSOR,        NCOL|VIZ},
  63. /* ^E  scroll up    */    {m_scroll,    CURSOR,        NCOL|VIZ},
  64. /* ^F  page forward    */    {m_scroll,    CURSOR,        FRNT|VIZ},
  65. /* ^G  show file status    */    {v_status,    NO_ARGS,     NO_FLAGS},
  66. /* ^H  move left, like h*/    {m_left,    CURSOR,        MVMT|VIZ},
  67. /* ^I  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  68. /* ^J  move down    */    {m_updnto,    CURSOR,        MVMT|LNMD|VIZ|INCL},
  69. /* ^K  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  70. /* ^L  redraw screen    */    {v_redraw,    NO_ARGS,    NO_FLAGS|VIZ},
  71. /* ^M  mv front next ln */    {m_updnto,    CURSOR,        MVMT|FRNT|LNMD|VIZ|INCL},
  72. /* ^N  move down    */    {m_updnto,    CURSOR,        MVMT|LNMD|VIZ|INCL|NCOL},
  73. /* ^O  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  74. /* ^P  move up        */    {m_updnto,    CURSOR,        MVMT|LNMD|VIZ|INCL|NCOL},
  75. /* ^Q  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  76. /* ^R  redraw screen    */    {v_redraw,    NO_ARGS,    NO_FLAGS|VIZ},
  77. /* ^S  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  78. #ifndef NO_TAGSTACK
  79. /* ^T  pop tagstack    */    {v_pop,        CURSOR,        NO_FLAGS},
  80. #else
  81. /* ^T  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  82. #endif
  83. /* ^U  scroll up 1/2page*/    {m_scroll,    CURSOR,        NCOL|VIZ},
  84. /* ^V  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  85. /* ^W  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  86. /* ^X  move to phys col    */    {m_tocol,    CURSOR,        MVMT|NREL|VIZ},
  87. /* ^Y  scroll down    */    {m_scroll,    CURSOR,        NCOL|VIZ},
  88. #ifdef SIGTSTP
  89. /* ^Z  suspend elvis    */    {v_suspend,    NO_ARGS,    NO_FLAGS},
  90. #else
  91. /* ^Z  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  92. #endif
  93. /* ESC not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  94. /* ^\  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  95. /* ^]  keyword is tag    */    {v_tag,        KEYWORD,    NO_FLAGS},
  96. /* ^^  previous file    */    {v_switch,    CURSOR,        FRNT},
  97. /* ^_  move to row    */    {m_row,        CURSOR,        MVMT|NCOL|INCL|VIZ},
  98. /* SPC move right,like l*/    {m_right,    CURSOR,        MVMT|INCL|VIZ},
  99. /*  !  run thru filter    */    {v_filter,    CURSOR_MOVED,    FRNT|LNMD|INCL|VIZ},
  100. /*  "  select cut buffer*/    {v_selcut,    C_K_CUT,    PTMV|VIZ},
  101. #ifndef NO_EXTENSIONS
  102. /*  #  increment number    */    {v_increment,    KEYWORD,    SDOT},
  103. #else
  104. /*  #  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  105. #endif
  106. /*  $  move to rear    */    {m_rear,    CURSOR,        MVMT|INCL|VIZ},
  107. /*  %  move to match    */    {m_match,    CURSOR,        MVMT|INCL|VIZ},
  108. /*  &  repeat subst    */    {v_again,    CURSOR_MOVED,    SDOT|NCOL|LNMD|INCL},
  109. /*  '  move to a mark    */    {m_tomark,    C_C_K_MARK,    MVMT|FRNT|NREL|LNMD|INCL|VIZ},
  110. #ifndef NO_SENTENCE
  111. /*  (  mv back sentence    */    {m_sentence,    CURSOR,        MVMT|VIZ},
  112. /*  )  mv fwd sentence    */    {m_sentence,    CURSOR,        MVMT|VIZ},
  113. #else
  114. /*  (  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  115. /*  )  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  116. #endif
  117. #ifndef NO_ERRLIST
  118. /*  *  errlist        */    {v_errlist,    CURSOR,        FRNT|NREL},
  119. #else
  120. /*  *  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  121. #endif
  122. /*  +  mv front next ln */    {m_updnto,    CURSOR,        MVMT|FRNT|LNMD|VIZ|INCL},
  123. #ifndef NO_CHARSEARCH
  124. /*  ,  reverse [fFtT] cmd*/    {m__ch,        CURSOR,        MVMT|INCL|VIZ},
  125. #else
  126. /*  ,  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  127. #endif
  128. /*  -  mv front prev ln    */    {m_updnto,    CURSOR,        MVMT|FRNT|LNMD|VIZ|INCL},
  129. /*  .  special...    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  130. /*  /  forward search    */    {m_fsrch,    CURSOR_TEXT,    MVMT|NREL|VIZ},
  131. /*  0  part of count?    */    {NO_FUNC,    ZERO,        MVMT|PTMV|VIZ},
  132. /*  1  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  133. /*  2  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  134. /*  3  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  135. /*  4  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  136. /*  5  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  137. /*  6  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  138. /*  7  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  139. /*  8  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  140. /*  9  part of count    */    {NO_FUNC,    DIGIT,        PTMV|VIZ},
  141. /*  :  run single EX cmd*/    {v_1ex,        CURSOR_TEXT,    NO_FLAGS|VIZ},
  142. #ifndef NO_CHARSEARCH
  143. /*  ;  repeat [fFtT] cmd*/    {m__ch,        CURSOR,        MVMT|INCL|VIZ},
  144. #else
  145. /*  ;  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS|VIZ},
  146. #endif
  147. /*  <  shift text left    */    {v_lshift,    CURSOR_MOVED,    SDOT|FRNT|LNMD|INCL|VIZ},
  148. /*  =  preset filter    */    {v_reformat,    CURSOR_MOVED,    SDOT|FRNT|LNMD|INCL|VIZ},
  149. /*  >  shift text right    */    {v_rshift,    CURSOR_MOVED,    SDOT|FRNT|LNMD|INCL|VIZ},
  150. /*  ?  backward search    */    {m_bsrch,    CURSOR_TEXT,    MVMT|NREL|VIZ},
  151. #ifndef NO_AT
  152. /*  @  execute a cutbuf */    {v_at,        C_C_K_CUT,    NO_FLAGS},
  153. #else
  154. /*  @  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  155. #endif
  156. /*  A  append at EOL    */    {v_insert,    CURSOR,        SDOT},
  157. /*  B  move back Word    */    {m_bword,    CURSOR,        MVMT|VIZ},
  158. /*  C  change to EOL    */    {v_change,    CURSOR_EOL,    SDOT},
  159. /*  D  delete to EOL    */    {v_delete,    CURSOR_EOL,    SDOT},
  160. /*  E  move end of Word    */    {m_eword,    CURSOR,        MVMT|INCL|VIZ},
  161. #ifndef NO_CHARSEARCH
  162. /*  F  move bk to char    */    {m_Fch,        C_C_K_CHAR,    MVMT|INCL|VIZ},
  163. #else
  164. /*  F  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  165. #endif
  166. /*  G  move to line #    */    {m_updnto,    CURSOR,        MVMT|NREL|LNMD|FRNT|INCL|VIZ},
  167. /*  H  move to row    */    {m_row,        CURSOR,        MVMT|LNMD|FRNT|VIZ|INCL},
  168. /*  I  insert at front    */    {v_insert,    CURSOR,        SDOT},
  169. /*  J  join lines    */    {v_join,    CURSOR,        SDOT},
  170. #ifndef NO_EXTENSIONS
  171. /*  K  look up keyword    */    {v_keyword,    KEYWORD,    NO_FLAGS},
  172. #else
  173. /*  K  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  174. #endif
  175. /*  L  move to last row    */    {m_row,        CURSOR,        MVMT|LNMD|FRNT|VIZ|INCL},
  176. /*  M  move to mid row    */    {m_row,        CURSOR,        MVMT|LNMD|FRNT|VIZ|INCL},
  177. /*  N  reverse prev srch*/    {m_nsrch,    CURSOR,        MVMT|NREL|VIZ},
  178. /*  O  insert above line*/    {v_insert,    CURSOR,        SDOT},
  179. /*  P  paste before    */    {v_paste,    CURSOR,        SDOT},
  180. /*  Q  quit to EX mode    */    {v_quit,    NO_ARGS,    NO_FLAGS},
  181. /*  R  overtype        */    {v_overtype,    CURSOR,        SDOT},
  182. /*  S  change line    */    {v_change,    CURSOR_MOVED,    SDOT},
  183. #ifndef NO_CHARSEARCH
  184. /*  T  move bk to char    */    {m_Tch,        C_C_K_CHAR,    MVMT|INCL|VIZ},
  185. #else
  186. /*  T  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  187. #endif
  188. /*  U  undo whole line    */    {v_undoline,    CURSOR,        FRNT},
  189. #ifndef NO_VISIBLE
  190. /*  V  start visible    */    {v_start,    CURSOR,        INCL|LNMD|VIZ},
  191. #else
  192. /*  V  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  193. #endif
  194. /*  W  move forward Word*/    {m_fword,    CURSOR,        MVMT|INCL|NWRP|VIZ},
  195. /*  X  delete to left    */    {v_xchar,    CURSOR,        SDOT},
  196. /*  Y  yank text    */    {v_yank,    CURSOR_MOVED,    NCOL},
  197. /*  Z  save file & exit    */    {v_xit,        CURSOR_CNT_KEY,    NO_FLAGS},
  198. /*  [  move back section*/    {m_paragraph,    CURSOR,        MVMT|LNMD|NREL|VIZ},
  199. #ifndef NO_POPUP
  200. /*  \  pop-up menu    */    {v_popup,    CURSOR_MOVED,    VIZ},
  201. #else
  202. /*  \  not defined    */    {NO_FUNC,    NO_ARGS,    NO_FLAGS},
  203. #endif
  204. /*  ]  move fwd section */    {m_paragraph,    CURSOR,        MVMT|LNMD|NREL|VIZ},
  205. /*  ^  move to front    */    {m_front,    CURSOR,        MVMT|VIZ},
  206. /*  _  current line    */    {m_updnto,    CURSOR,        MVMT|LNMD|FRNT|INCL},
  207. /*  `  move to mark    */    {m_tomark,    C_C_K_MARK,    MVMT|NREL|VIZ},
  208. /*  a  append at cursor    */    {v_insert,    CURSOR,        SDOT},
  209. /*  b  move back word    */    {m_bword,    CURSOR,        MVMT|VIZ},
  210. /*  c  change text    */    {v_change,    CURSOR_MOVED,    SDOT|VIZ},
  211. /*  d  delete op    */    {v_de